package com.blog.util.http;

/**
 * @ClassName HttpUtil
 * @Destription huto http 工具类
 * @Author 天堂小野花
 * @Date 2025/7/18  0:51
 * @Version 1.0
 */
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.Method;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

@Slf4j
@Component
public class HttpUtil {

    /**
     * 发送GET请求
     *
     * @param url     请求地址
     * @param params  请求参数
     * @param headers 请求头
     * @return 响应结果
     */
    public static String get(String url, Map<String, Object> params, Map<String, String> headers) {
        return execute(Method.GET, url, params, null, headers);
    }

    /**
     * 发送POST请求
     *
     * @param url     请求地址
     * @param params  请求参数
     * @param body    请求体
     * @param headers 请求头
     * @return 响应结果
     */
    public static String post(String url, Map<String, Object> params, Object body, Map<String, String> headers) {
        return execute(Method.POST, url, params, body, headers);
    }

    /**
     * 发送PUT请求
     *
     * @param url     请求地址
     * @param params  请求参数
     * @param body    请求体
     * @param headers 请求头
     * @return 响应结果
     */
    public static String put(String url, Map<String, Object> params, Object body, Map<String, String> headers) {
        return execute(Method.PUT, url, params, body, headers);
    }

    /**
     * 发送DELETE请求
     *
     * @param url     请求地址
     * @param params  请求参数
     * @param headers 请求头
     * @return 响应结果
     */
    public static String delete(String url, Map<String, Object> params, Map<String, String> headers) {
        return execute(Method.DELETE, url, params, null, headers);
    }

    /**
     * 执行HTTP请求
     *
     * @param method  请求方法
     * @param url     请求地址
     * @param params  请求参数
     * @param body    请求体
     * @param headers 请求头
     * @return 响应结果
     */
    private static String execute(Method method, String url, Map<String, Object> params, Object body, Map<String, String> headers) {
        try {
            // 创建请求对象
            HttpRequest request = HttpRequest.of(url)
                    .method(method)
                    .timeout(5000); // 设置超时时间为5秒

            // 设置请求头
            if (headers != null && !headers.isEmpty()) {
                headers.forEach(request::header);
                request.header("Content-Type", "multipart/form-data");
            }

            // 设置请求参数
            if (params != null && !params.isEmpty()) {
                request.form(params);
            }

            // 设置请求体
            if (body != null) {
                if (body instanceof String) {
                    request.body((String) body);
                } else {
                    request.body(JSONUtil.toJsonStr(body));
                }
            }

            // 发送请求并获取响应
            HttpResponse response = request.execute();

            // 记录请求日志
            logRequest(method, url, params, body, headers, response);

            // 返回响应结果
            return response.body();
        } catch (Exception e) {
            log.error("HTTP请求异常: {}", e.getMessage(), e);
            throw new RuntimeException("HTTP请求异常: " + e.getMessage());
        }
    }

    /**
     * 记录请求日志
     */
    private static void logRequest(Method method, String url, Map<String, Object> params, Object body,
                                   Map<String, String> headers, HttpResponse response) {
        StringBuilder logBuilder = new StringBuilder();
        logBuilder.append("\n=== HTTP请求日志 ===");
        logBuilder.append("\n请求方法: ").append(method);
        logBuilder.append("\n请求地址: ").append(url);

        if (params != null && !params.isEmpty()) {
            logBuilder.append("\n请求参数: ").append(JSONUtil.toJsonStr(params));
        }

        if (body != null) {
            logBuilder.append("\n请求体: ").append(body instanceof String ? body : JSONUtil.toJsonStr(body));
        }

        if (headers != null && !headers.isEmpty()) {
            logBuilder.append("\n请求头: ").append(JSONUtil.toJsonStr(headers));
        }

        logBuilder.append("\n响应状态码: ").append(response.getStatus());
        logBuilder.append("\n响应内容: ").append(response.body());
        logBuilder.append("\n===================");

        log.info(logBuilder.toString());
    }

    /**
     * 将响应结果转换为指定类型的对象
     *
     * @param response 响应结果
     * @param clazz    目标类型
     * @param <T>      泛型类型
     * @return 转换后的对象
     */
    public static <T> T parseResponse(String response, Class<T> clazz) {
        if (StrUtil.isBlank(response)) {
            return null;
        }
        return JSONUtil.toBean(response, clazz);
    }

    /**
     * 将响应结果转换为JSONObject对象
     *
     * @param response 响应结果
     * @return JSONObject对象
     */
    public static JSONObject parseResponseToJson(String response) {
        if (StrUtil.isBlank(response)) {
            return null;
        }
        return JSONUtil.parseObj(response);
    }
}